/*******************************************************************

    Author: Xiao
    Date: 2022/3/28 13:40

*******************************************************************/
package utils

import (
	"fmt"
	"gopkg.in/gomail.v2"
	"mcr/pkg/config"
	"regexp"
)

// 邮件验证格式
const MailMess = `
	<div id="qm_con_body">
		<div id="mailContentContainer" class="qmbox qm_con_body_content qqmail_webmail_only" style="opacity: 1;">
			<div style="border-radius:20px;padding: 20px;background-color:#f5f5f5;color:#333;display:inline-block;">
				<div style="font-size:16px;font-weight:bold;">MCR(BBBUG GO) 邮箱验证码</div>
				<div style="margin-top:20px;">你的验证码为:<span style="font-weight:bold;color:orangered">%s</span>，请在十分钟内使用。</div>
			<div style="margin-top:5px;font-size:12px;color:#aaa;font-weight:300">A music chat room build by a novice gopher.</div></div>
		<style type="text/css">.qmbox style, .qmbox script, .qmbox head, .qmbox link, .qmbox meta {display: none !important;}</style>
	</div></div>`

// 发送邮箱验证码
func SendVerifyMail(addr,verify string) error{
	if !VerifyEmailFormat(addr){
		return fmt.Errorf("邮箱地址不合法(%s)",addr)
	}

	body := fmt.Sprintf(MailMess,verify)
	err := SendMail(addr,"MCR(BBBUG GO) 邮箱验证",body)
	if err != nil {
		return err
	}
	return nil
}

// 验证邮箱格式
func VerifyEmailFormat(email string) bool {
	pattern := `^[0-9a-z][_.0-9a-z-]{0,31}@([0-9a-z][0-9a-z-]{0,30}[0-9a-z]\.){1,4}[a-z]{2,4}$`
	reg := regexp.MustCompile(pattern)
	return reg.MatchString(email)
}

// 发送邮件
func SendMail(add,subject,body string) error {
	m := gomail.NewMessage()
	// 这种方式可以添加别名，即 nickname， 也可以直接用<code>m.SetHeader("From", MAIL_USER)</code>
	m.SetHeader("From",config.ConfigValue.Mail.Nickname + "<" +config.ConfigValue.Mail.User + ">")
	// 发送给多个用户
	m.SetHeader("To", add)
	// 设置邮件主题
	m.SetHeader("Subject", subject)
	// 设置邮件正文
	m.SetBody("text/html", body)
	// 发送附件
	d := gomail.NewDialer(config.ConfigValue.Mail.Host, config.ConfigValue.Mail.Port, config.ConfigValue.Mail.User, config.ConfigValue.Mail.Password)
	// 发送邮件
	err := d.DialAndSend(m)
	return err
}